package com.codiform.moo.property.source; import java.io.Serializable; import org.mvel2.CompileException; import org.mvel2.MVEL; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.codiform.moo.MissingSourcePropertyException; import com.codiform.moo.property.source.SourceProperty; import com.codiform.moo.property.source.SourcePropertyFactory; public class MvelSourcePropertyFactory implements SourcePropertyFactory { private static final String SUPPORTED_PREFIX = "mvel"; private final Logger log = LoggerFactory.getLogger( getClass() ); @Override public SourceProperty getSourceProperty( String expression ) { try { return compileAndReturnProperty( expression ); } catch( ArrayIndexOutOfBoundsException exception ) { // Unprefixed expression, just log and continue by returning null. log.warn( "Error while compiling expression {}", exception ); return null; } catch( CompileException exception ) { // Unprefixed expression, just log and continue by returning null. log.warn( "Error while compiling expression {}", exception ); return null; } } private MvelSourceProperty compileAndReturnProperty( String expression ) { Serializable compiled = MVEL.compileExpression( expression ); return new MvelSourceProperty( expression, compiled ); } @Override public SourceProperty getSourceProperty( String expressionPrefix, String unprefixedExpression ) { // Because MVEL prefix was used, assume that a failure here is worth reporting right away. try { return compileAndReturnProperty( unprefixedExpression ); } catch( ArrayIndexOutOfBoundsException exception ) { throw new MissingSourcePropertyException( expressionPrefix + ":" + unprefixedExpression, exception ); } catch( CompileException exception ) { throw new MissingSourcePropertyException( expressionPrefix + ":" + unprefixedExpression, exception ); } } @Override public boolean supportsPrefix( String prefix ) { return SUPPORTED_PREFIX.equals( prefix ); } }